package com.donar.nio.buffer;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Buffer 缓冲区  他的本质是一一块可以写入数据然后从中读取数据的内存
 *
 * buffer 的主要属性有三个
 * capacity
 * position
 * limit
 *
 * 在写模式下postion的位置为当前写入的index 初始化位置是0 最大值为 capacity - 1
 * 在读模式下postion 的位置代表当前读取到的位置 从写模式切换为读模式的时候 postion 会被置为0
 *
 * limit 在写模式下代表你最多能往buffer里面写入多少数据 写模式下buffer的size 等于 capacity的容量
 * 当切换到读模式的时候limit代表你最多能读多少数据 因此写模式切换到读模式的时候limit的值会被设置成 position
 *
 * 常用的buffer类型有
 * ByteBuffer MapByteBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer
 *
 *
 * flip方法将  buffer从写模式切换为读模式
 * rewind方法   在读模式下将postion 置为零 允许你重新从头开始读取数据 limit 是保持不变的
 * clear方法 在写模式下将position置为零
 * compact方法 将唯独的数据拷到buffer起始处然后将postion设置到最后一个未读元素的后面 准备开始写数据   简单的理解就是把未读完的数据可将写入的数据合并到一个buffer里面
 * mark方法 在读模式下标一个position的临时位置,然后 使用reset方法可以将postion重置到这个位置
 *
 *
 */
public class ReadFile {
    public static void main(String[] args) throws IOException {

        RandomAccessFile file = new RandomAccessFile(ReadFile.class.getClassLoader().getResource("niotestdata.txt").getFile(),"rw");
        FileChannel channel = file.getChannel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(512);//创建固定大小的buffer用于接受消息 此时默认buffer 的模式应该为读模式
        int readCount = channel.read(byteBuffer);//从channel中读取内容到buffer中
        while(readCount>0){
            byteBuffer.flip();//buffer 读写模式切换
            while (byteBuffer.hasRemaining()){ //buffer中还有未读完的数据的话继续读
                System.out.print((char)byteBuffer.get()); //读取buffer中的数据并打印
            }
            byteBuffer.clear();//读取完成后清空buffer
            readCount = channel.read(byteBuffer);
        }
        file.close();
    }
}
